\380. Insert Delete GetRandom O(1)
Medium
1501109Share
Design a data structure that supports all following operations in average O(1) time.
insert(val)
: Inserts an item val to the set if not already present.remove(val)
: Removes an item val from the set if present.getRandom
: Returns a random element from current set of elements. Each element must have the same probability of being returned.
Example:
1 | // Init an empty set. |
python list,set,dictionary时间复杂度参考。这题重点在于如何实现O(1)的时间,因为在python list 里,remove 和 insert 都是O(n)的时间复杂度。题目要求 insert 和 remove 能够判断 val 在不在里面,list 的 in 也是O(n)。 所以我们就想到了用hash map,或者说是set。
然后我就想到下面的代码,但是虽然满足了remove, add, in都是O(1),但是缺不能满足getRandom(self),因为list()需要的时间是O(n).
错误示范:
1 | import random |
所以,思来想去还是需要一个list来存储val。但是remove如何在O(1)时间删除list里的东西又成了问题。这时候就参考了这个方法,简而言之,记录每一个val在list里的位置,然后将此位置上的val替换成末尾的数,再在dict里更新末位数位置(当前val的位置)把末尾的数pop出去就行了。
1 | import random |